查询计划会根据sql语句的预估开销来决策选择哪种motion,一般情况下,假设我有语句GP相比其他数据库有的操作类型,有一个额外操作类型叫做motion,一个motion操作会涉及segment进行查询时的数据移动。并非所有的操作都会触发moiton操作。例如精确查询,不会涉及到segment之间的数据交互。当sql语句涉及到join、aggregation、sort(或其他对于行的操作),就会有移动数据的需求,GP生成查询计划的时候会有motion node出现。
GP有如下几种motion方式:
- Broadcast Motion:广播方式,每个节点向其他节点广播需要发送的数据。
- redistribute motion:重分布移动数据,当sql语句做join的时候,join的列值hash不同,将筛选后的数据在其他segment重新发布.
- explicit redistribute motion:
- gather motion : segment数据汇聚到master。
使用哪种motion
关于gather motion
查询计划会根据sql语句的预估开销来决策选择哪种motion,以tpc的语句为例,查看其执行计划12345explain select count(*) from store_sales,household_demographics ,time_dim, storewhere ss_sold_time_sk = time_dim.t_time_sk and ss_hdemo_sk = household_demographics.hd_demo_skand ss_store_sk = s_store_sk and time_dim.t_hour = 8 and time_dim.t_minute >= 30and household_demographics.hd_dep_count = 5 and store.s_store_name = 'ese'order by count(*) limit 100;
返回结果
可以看到执行计划中有3个brodacst motion,每个segment在这步slice(查询计划中能独立执行的单元)中都会做brodcast,以最后一步的-> Broadcast Motion 64:64 (slice3; segments: 64) (cost=0.00..622.00 rows=721 width=4)
-> Seq Scan on household_demographics (cost=0.00..154.00 rows=12 width=4)
Filter: hd_dep_count = 5
为例,每个segment都会将household_demographics表的结果集hd_dep_count广播给其他所有的segment。因此,结果集会影响brocastmotion的性能。
如果类似的操作需要大量的结果集,那gp的查询计划会评估需要gather motion动作开销太大,会改变执行计划将将一部分工作在segment内部完成掉。
关于redistribute motion
以sql语句SELECT customer, amount
FROM sales JOIN customer USING (cust_id)
WHERE dateCol = '04-30-2008';
为例,customer 表的分布键为cust_id,而sales的分部件为sale_id,为了较高效的完成这个join,我们指定sales表也必需使用cust_id重分布,此时执行查询计划会有三个slice。可以看到查询计划如下:
具体解读:
slice1:扫描cutomsers表,同时扫描sales表,并将sales表按照cust_id做重分布,根据hash结果将数据移动到对应的segment上。
slice2:每个segment把重分布过后的结果集拿来做hash join,并将join的结果集传输给master。
关于explicit redistribute motion
在官网上看到有redistibute motion类型,但没看到资料,也没成功触发过
关于gather motion
一个query会生成query plan,由master将query plan拷贝给各个segment运行,各个segment在运行完query plan之后会把各个数据返回给master,数据返回这个动作会有gather motion。
大部分操作都有gather motion,但并非所有。比如create table,insert 之类的没有结果集的语句,或者工具模式连接到某个segment或master上直接运行的sql语句,不会有segment把结果集发送给master的动作,便不会有gather motion动作。